package com.cskaoyan._03innerclazz._04local._03usecase;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/13 16:10
 **/
/*
局部内部类经常使用在以下两个场景中：

1. 方法需要返回一个对象，返回值类型是引用数据类型时。
   方法需要返回一个对象时，可以在方法的局部位置写一个 局部内部类
   继承/实现外部的类/接口，创建对象后作为返回值。
   这是因为方法的返回值可以是返回值类型的对象，也可以是子类对象
   （当返回值类型是引用数据类型时）。

2. 方法需要传入一个对象，形参数据类型是引用数据类型时。
   方法需要传入一个对象实参时，可以在调用方法的位置定义一个 局部内部类
   来继承/实现外部的类/接口，创建对象后作为方法的实参传入。
   这是因为方法的实参可以是形参类型的对象，也可以子类对象
   （当返回值类型是引用数据类型时）。

使用局部内部类的优点：

1. 绝对对外界隐藏，封装。
2. 相比较于传统的定义类，然后创建对象，它相对更加简洁省事。
缺点：
1. 这个类是一次性的。
综上，假如在局部位置需要一次性的使用某个对象，可以使用局部内部类创建它，
但是如果多次在不同的方法中使用，使用局部内部类就得不偿失了。
 */
public class Demo {
    public static void main(String[] args) {
        // 方法传入一个对象
        // 常规做法
        //m3(new Father());
        //m3(new Son());

        // 使用局部内部类
        // 局部位置
        class Son extends Father{

        }
        m3(new Son());


        // 常规做法
        // m4(new A());
        // 局部位置
        // 局部内部类
        class AA implements IA{

        }
        m4(new AA());
    }

    public static Father m1() {
        // 常规做法
        // return new Father();
        // return new Son();
        // 局部位置
        class Son2 extends Father{

        }
        return new Son2();
    }


    public static IA m2() {
        // 常规做法
        // return new A();
        // 使用局部内部类
        class A implements IA{

        }
        // 创建IA的子类对象 ,即A对象返回
        return new A();

    }

    public static void m3(Father father) {

    }

    public static void m4(IA ia) {

    }

}

class Father {

}
class Son extends Father{

}

interface IA{

}

class A implements IA{

}